(function() {
	var HZBank = this.HZBank || (this.HZBank = {}), //
	Utils = HZBank.Utils = HZBank.Utils || (this.HZBank.Utils = {}), //
	$ = this.$ || this.jQuery, //
	Cache = HZBank.Core.Cache, //
	URL = {}, //
	DEFAULT_OPTION = {
		def : {
			text : '请选择',
			val : ''
		},
		table : 'para'
	}, BASE_URL;
	// 设置站点基础名
	Utils.setBaseUrl = function(url) {
		BASE_URL = url;
		URL = {
			SELECT : BASE_URL + '/common/sort/getSelect',
			SELECTS : BASE_URL + '/common/sort/getInitSelect',
			DROPLIST : BASE_URL + '/common/sort/getMutiSelect',
			DROPLISTNAME : BASE_URL + '/common/sort/getSelectedNames'
		};
	};
	Utils.setBaseUrl("");

	Utils.maskBlock = function(block) {
		var $mask = $('<div class="mask">');
		var $block = $(block);
		mask.css({
			width : $block.width(),
			height : $block.height()
		});
		$block.append($mask);
		return $mask;
	};

	/**
	 * @param parent
	 *            mask container
	 */
	Utils.mask = function(parent) {
		var $mask = $('<div class="mask">'), $parent = $(parent), $win = $(window);
		if ($parent.size() == 0) {
			$parent = $('body');
		}
		$mask.css({
			width : $win.width(),
			height : $win.height()
		});
		$parent.append($mask);
		return $mask;
	};

	/**
	 *
	 * 将FORM内部所有表单域封装为JSON对象
	 * JSON中key为表单名
	 *
	 * @param form{String/jQuery}
	 *            form名，遵循jQuery选择器使用方式
	 * @param quick{boolean}
	 *            默认为false
	 *            true 快速封装，不会对表单名中带有.的表单域进行深度封装
	 *
	 */
	Utils.form2json = function(form, quick) {
		var $moneyNum = $(form).find('input[data-type="moneyNum"]');
		var $cardNum = $(form).find('input[data-type="cardNum"]');
		//数据收集前转换
		$moneyNum.each(function(){
			$(this).val(HZBank.Utils.CashFormat.removeComma($(this).val()));
		});
		$cardNum.each(function(){
			$(this).val(HZBank.Utils.Rules.removeSpace($(this).val()));
		});
		//收集数据
		var obj = {}, pattern = /.+\[\d*\]+$/, a = $(form).serializeArray();
		//收集数据后
		$moneyNum.each(function(){
			$(this).val(HZBank.Utils.CashFormat.toCashWithComma($(this).val()));
		});
		$cardNum.each(function(){
			$(this).val(HZBank.Utils.Rules.cardNum($(this).val()));
		});
		////console.log(a.length);
		////console.log(a);
		$.each(a, function() {
			////console.log(this);
			var type=$('[name="'+this.name+'"]').attr('type');
			if($('[name="'+this.name+'"]').data('type') === 'multiple-select'){
				type = 'multiple-select';
			}
			if (this.name.indexOf('.') != -1 && !quick) {
				var params = this.name.split('.'), innerobj = obj;
				for ( var i = 0; i < params.length - 1; i++) {
					var index = -1, name = params[i], tobj;
					if (pattern.test(name)) {
						index = name.substring(name.indexOf('[') + 1, name.indexOf(']'));
						name = name.substring(0, name.indexOf('['));
					}
					tobj = innerobj[name];
					// TODO What about this?
					// || tobj.constructor === Array ||
					// typeof (tobj) === 'string'
					if (tobj === undefined){
						if (-1 === index) {
							innerobj[name] = {};
						} else {
							innerobj[name] = [];
						}
					}
					if (-1 === index){
						innerobj = innerobj[name];
					} else {
						if (!innerobj[name][index]){
							innerobj[name][index] = {};
						}
						innerobj = innerobj[name][index];
					}
				}
				generate(innerobj, params[params.length - 1], this.value,type);
			} else {
				generate(obj, this.name, this.value,type);
			}
		});		
		return obj;
	};
	
	//给页面里面所有有更新的菜单打上更新提醒标记
	Utils.setUpdateMark = function(config){
		var targetEls = $('[data-update="true"]');
		targetEls.each(function(index, el){
			var iconEl = $('<samp class="new-icon">新</samp>');
			if($(this).attr('data-update') == 'true' && $(this).find('.new-icon').length < 1){
				$(this).append(iconEl);
				$(this).attr('data-isclick', 'false');
				$(this).attr('data-update', 'false');
			}
		});
		
		$(targetEls).off('click');
		$(targetEls).on('click', function(){
			//如果是叶子节点则给该节点绑上点击事件，第一次点击的时候向服务端发送请求更新当前菜单被点击的记录
		    var isParent = $(this).attr('data-isparent');
			if(isParent && isParent == 'false'){
				//当用户是第一次点击当前菜单的时候才向服务端发送请求
				if($(this).attr('data-isclick') == 'false'){
					$.ajax({
						url     : config.url+'?id='+this.id,
						dataType: "json",
						success : function(data){
							console.log('菜单状态更新成功！');
							//将当前的节点状态改为已经点击过
							$(this).attr('data-isclick', 'true');
						}
					});
				}
			}
		});
		
	}
	
	//默认调用给菜单添加更新标记的方法，适用页面同步刷新的内容和模块，异步调用请另外在业务里面去调用
	/*var timerUpdate = setInterval(function(){
		Utils.setUpdateMark({
		    url: urlroot + '/themeMenu/clickNewThemeMenuRisk'
		});
	}, 1000);*/
	
	$(document).on("DOMSubtreeModified", function(event){
        Utils.setUpdateMark({
        	url: urlroot + '/themeMenu/clickNewThemeMenuRisk'
		});
    });
	
	/**
	 *
	 * 将FORM内部所有表单域封装为JSON对象后转换为字符串
	 *
	 * @param form{String/jQuery}
	 *            form名，遵循jQuery选择器使用方式
	 * @param quick{boolean}
	 *            默认为false
	 *            true 快速封装，不会对表单名中带有.的表单域进行深度封装
	 *
	 */
	Utils.F2JString = function(form, quick) {
		return JSON.stringify(HZBank.Utils.form2json(form, quick));
	};

	function generate(obj, name, value,type) {
		if (obj[name] === undefined) {
			if(type==='checkbox'){
				obj[name]=[value];
			}else if(type === 'multiple-select'){
				obj[name]=[value];
			}else{
				obj[name] = value;				
			}
		} else {
			if (!obj[name].push) {
				obj[name] = [ obj[name] ];
			}
			obj[name].push(value);
		}
		return obj;
	}

	/**
	 *
	 * 将JSON对象内的数据显示到form表单域中
	 *
	 * @param form{String/jQuery}
	 *            form名，遵循jQuery选择器使用方式
	 * @param json{JSON}
	 *            需要填充的JSON对象
	 * @param pre{String}
	 * 			  如果form表单域中带有JSON对象中不存在的前缀，可以设置该属性
	 *
	 */
	Utils.json2form = function(form, json, pre) {
		var name, value, $e, $form = $(form);
		pre = pre || '';
		for ( var key in json) {
			name = pre + key;
			value = json[key];
			if ($.isPlainObject(value)) {
				Utils.json2form(form, value, name + '.');
			} else {
				$e = $form.find("[name='" + name + "']");
				// value is array
				if ($.isArray(value)) {
					// checkbox array
					if ($e.is('input[type=checkbox]')) {
						$e.val(value);
						// widget reset
						$e.checkbox('refresh');
					} else {
						// multiple line
						// TODO
						var isObj = value.length ? $.isPlainObject(value[0]) : false;
						for ( var j = 0; j < value.length; j++) {
							var arr = value[j];
							if (isObj) {
								Utils.json2form(form, arr, name + '[' + j + '].');
							} else {
								if ($e.is('select[multiple]')) {
									// multiple select field
									$e.val(arr);
									$e.select('value', arr);
								} else {
									$e.eq(j).val(arr);
									// text input or single select field
									if ($e.eq(j).is('select')) {
										$e.eq(j).select('value', arr);
									}
								}
							}
						}
					}
				} else {
					if ($e.is('input[type=radio]')) {
						// radio
						$e.val([ value ]);
						// widget reset
						$e.radio('refresh');
					} else if ($e.is('input[type=checkbox]')) {
						// single checkbox
						$e.val([ value ]);
						// widget reset
						$e.checkbox('refresh');
					} else {
						$e.val(value);
						if ($e.is('select')) {
							$e.select('value', value);
						}
					}
				}
			}
			// name = "[name='" + pre + key + "']"
		}
	};

	/**
	 *
	 * 获取多选下拉菜单数据
	 *
	 * @param opts{JSON}
	 *
	 *            url 		: 后台数据获取地址，默认为URL.DROPLIST
	 *            cache 	: 是否使用页面缓存
	 *            table 	: 在使用默认URL的时候，表示获取数据来源表
	 *            type 		: 获取数据当前类别
	 *            ftype 	: 获取数据当前的父类别
	 *            success 	: 获取成功后行为
	 *
	 */
	Utils.getSlideNameList = function(opts){
		var url = URL.DROPLISTNAME, //
		key = 'SLIDE_LIST_' + opts.type + '_' + opts.ftype; //
		$.ajax({
			url : url,
			cache : false,
			type : 'POST',
			contentType:'application/json;charset=UTF-8',
			data : JSON.stringify({
				table : opts.table || 'para',
				key : opts.type,
				selectedValues:opts.values
			}),
			success : function(data) {
					opts.success && opts.success.apply(this, arguments);
			}
		});
	};
	Utils.getSlideList = function(opts) {
		opts = opts || {};
		var url = opts.url || URL.DROPLIST, //
		cache = opts.cache === undefined ? true : opts.cache, //
		key = 'SLIDE_LIST_' + opts.type + '_' + opts.ftype; //
		var path = opts.path||[];
		if (!(cache && Cache.cache(key, opts.success))) {
			$.ajax({
				url : url,
				cache : cache,
				type : 'POST',
				contentType:'application/json;charset=UTF-8',
				data : JSON.stringify({
					table : opts.table || 'para',
					key : opts.type,
					parentId : opts.ftype
					//path : path
//					values:opts.values
				}),
				success : function(data) {
					if (cache) {
						Cache.callAll(key, arguments, this);
					} else {
						opts.success && opts.success.apply(this, arguments);
					}
				}
			});
		}
	};


	/**
	 *
	 * 获取多选下拉菜单数据
	 *
	 * @param opts{JSON}
	 *
	 *            url 		: 后台数据获取地址，默认为URL.SELECTS
	 *            cache 	: 是否使用页面缓存
	 *            types 	: 获取数据类别列表
	 *            success 	: 获取成功后行为
	 *
	 */
	Utils.getSelects = function(opts) {
		opts = $.extend({}, DEFAULT_OPTION, opts || {});
		var types = [], //
			$els = opts.els, //
			url = opts.url || URL.SELECTS, //
			cache = opts.cache === undefined ? true : opts.cache; //
		for ( var i = 0; i < opts.types.length; i++) {
			var ckey = 'SELECT_'  + opts.types[i].key;
			if (Cache.isCached(ckey)) {
				generateSelect({
					el : $els.filter('[data-key="' + opts.types[i].key + '"]'),
					def : opts.def
				}, Cache.getData(ckey));
			}
			// Need to do some enhancement.
//			else if (Cache.isCaching(ckey)) {
//				//console.log(ckey);
//				Cache.addCallBack(ckey, opts.success);
//			}
			else {
				types.push(opts.types[i]);
				Cache.caching(ckey);
			}
		}
		if (types.length !== 0) {
			$.ajax({
				url : url,
				type : 'POST',
				cache : cache,
				contentType : 'application/json; charset=UTF-8',
				data : JSON.stringify({
					list : types
				}),
				success : function(data) {
					var json = data.returnObject;
					for ( var key in json) {
						var ckey = 'SELECT_' + key;
						Cache.addData(ckey, json[key]);
						Cache.addContent(ckey, this);
						generateSelect({
							el : $els.filter('[data-key="' + key + '"]'),
							def : opts.def
						}, json[key]);
					}
					opts.success && opts.success();
				}
			});
		} else {
			opts.success && opts.success();
		}
	};

	/**
	 *
	 * 获取多选下拉菜单数据
	 *
	 * @param opts{JSON}
	 *
	 *            url 		: 后台数据获取地址，默认为URL.SELECTS
	 *            cache 	: 是否使用页面缓存
	 *            type 		: 获取数据类别
	 *            success 	: 获取成功后行为
	 *
	 */
	Utils.getSelect = function(opts) {
		opts = $.extend({}, DEFAULT_OPTION, opts || {});

		var url = opts.url || URL.SELECT, //
			cache = opts.cache === undefined ? true : opts.cache; //
		// key = 'SELECT_' + opts.type, //

		$.ajax({
			url : url,
			cache : cache,
			data : {
				type : opts.type
			},
			success : opts.success
		});
	};

	/**
	 *
	 * 生成下拉菜单
	 *
	 * @param opts{JSON}
	 *            el : 生成下拉菜单的元素
	 *
	 * @param list{Array}
	 *    		  下拉列表数据
	 */
	function generateSelect(opts, list) {
		var $select = $(opts.el);
		$select.empty();
		$select.append($('<option>').attr({
			value : opts.def.val
		}).text(opts.def.text));
		if (list) {
			for ( var i = 0; i < list.length; i++) {
				var item = list[i];
				$select.append($('<option>').attr({
					value : item.sortNo
				}).text(item.sortName));
			}
		}
		// init selected data
		var select = $select.data('select');
		var value = $select.data('value');
		if (select && value !== undefined) {
			var obj = {
				text : $.trim($select.find('option[value=' + 'value' + ']').text()),
				val : value
			};
			if (select) {
				// optimal select
				select.refreshList();
				select.choose(obj);
			}
		}
	};
	Utils.formmask =function(t,el,time){
		var func = arguments.length>1 ? t : 'mask';
		var button = arguments.length>1 ? arguments[1] : arguments[0];
		var height,
		    width,
		    mask = $("<div class='form-button-mask' style='position:absolute;top:0;left:0'><i class='icon-loading-s'></i><span class='mask-number'>2</span></div>");
		if(!button.parent().hasClass('mask_temp')){
			button.wrap($("<div class='mask_temp' style='position:relative;display:inline-block'></div>"));
			if(button.hasClass('float-right')){
				button.parent().addClass('float-right');
			}else if(button.hasClass('float-left')){
				button.parent().addClass('float-left');
			}
		}
		if(func=='remove'){
			$(".form-button-mask").remove();
		}else if(func=='mask'){
			height = button.outerHeight();
			width = button.outerWidth();
			button.parent().append(mask);
			var p = $(".form-button-mask").find(".icon-loading-s").width();
			mask.css({
				height:height,
				paddingLeft:(width-p)/2,
				width:width
			})
			if(arguments.length==3){
				mask.find('.mask-number').hide();
				return;
			}
			var int = setInterval(function(){
				var number = parseInt($(".form-button-mask").find(".mask-number").html());
				if(number==1 || $(".form-button-mask").length==0){
					$(".form-button-mask").find(".mask-number").html(0);
					window.clearInterval(int);
					$(".form-button-mask").remove();
				}else{
				    number--;
					$(".form-button-mask").find(".mask-number").html(number);
				}
			},1000)
		}
	};
	
	/*
	 * 此方法用于比较两个指定的日期的大小，如果第一个日期大于第二个日期则返回数字1，两日期相等则返回0，第一个日期小于第二个日期则返回-1。
	 * 如果只传入一个指定日期则默认为将传入的日期与当前时间作比较，此指定日期为被比较日期，将会与当前时间进行比较。返回值规则同上。
	 * @param   firstDate (date string)
	 * @param   lastDate  (date string)
	 * @return  result    (Number)
	 * @author  yixu@hengtiansoft.com
 	 * @time    2013年12月21日
	 */
	Utils.dateCompare = function(firstDate, lastDate){
		var firstDateArr, lastDateArr, firstTime, lastTime, now, result;
	
		//将格式为2014-1-1的日期字符串转换为2014-01-01，以便转换为时间毫秒值进行比对
		firstDateArr = parseDate(firstDate.split('-'));
		firstDate = firstDateArr.join('-');
		
		//取得指定日期的毫秒值
		firstTime = +new Date(firstDate);
		
		
		//如果只传入了一个日期则设定比较日期为当前时间
		if(lastDate && lastDate != ''){
			//将格式为2014-1-1的日期字符串转换为2014-01-01，以便转换为时间毫秒值进行比对
			lastDateArr = parseDate(lastDate.split('-'));
			lastDate = lastDateArr.join('-');
			
			//取得指定日期的毫秒值
			lastTime = +new Date(lastDate);
		}else{
			var lastDate;
			//如果没有传入比对日期，则比对日期为当前时间
			now = new Date();
			lastDate = parseDate([now.getFullYear(), (now.getMonth() + 1) + '', now.getDate() + '']);
			//取得指定日期的毫秒值
			lastTime = +new Date(lastDate.join('-')); 
		}
		//如果被比较时间大于比较时间则结果值为1
		if(firstTime > lastTime){
			result = 1;
		
		//如果被比较时间小于比较时间则结果值为-1
		}else if(firstTime < lastTime){
			result = -1;
			
		//如果被比较时间等于比较时间则结果值为0
		}else{
			result = 0;
		}
		
		return result;
	};
	
	/*
	 * 此方法用于比较两个指定的时分秒00:00:00的大小，如果第一个时分秒大于第二个时分秒则返回数字1，相等则返回0，第一个时分秒小于第二个时分秒则返回-1。
	 * 如果只传入一个指定日期则默认为将传入的日期与当前时间作比较，此指定日期为被比较日期，将会与当前时间进行比较。返回值规则同上。
	 * @param   firstTime (String)
	 * @param   lastTime  (String)
	 * @return  result    (Number)
	 * @author  yixu@hengtiansoft.com
 	 * @time    2016年03月03日
	 */
	Utils.timeCompare = function(firstTime, lastTime){
		var firstMilliSeconds, lastMilliSeconds, result;
	
		firstMilliSeconds = +new Date('1970/01/01 ' + firstTime);
		lastMilliSeconds = +new Date('1970/01/01 ' + lastTime);
		
		//如果被比较时间大于比较时间则结果值为1
		if(firstMilliSeconds > lastMilliSeconds){
			result = 1;
		
		//如果被比较时间小于比较时间则结果值为-1
		}else if(firstMilliSeconds < lastMilliSeconds){
			result = -1;
			
		//如果被比较时间等于比较时间则结果值为0
		}else{
			result = 0;
		}
		
		return result;
	};
	
	/*
	 * 此方法用来将传入的非标准日期格式转换为标准的日期格式并以数组的形式返回个调用对象；
	 * @param   dateArr (Array)
	 * @return  dateArr (Array)
	 * @author  yixu@hengtiansoft.com
 	 * @time    2014年1月2日
	 */
	function parseDate(dateArr){
		for(var i=0,len=dateArr.length; i<len; i++){
			//如果当前元素不是时间里面的年份对象，则判断当前值的长度是不是小于2，如果小于2则表明当前月份或日期为个位数，在个位数前加上字符'0'即可。
			if(i>0){
				if(dateArr[i].length < 2){
					dateArr[i] = '0' + dateArr[i];
				}
			}
		}
		
		return dateArr;
	};
	
	function DetectFFPlugin(url){
		var mimetype = navigator.mimeTypes["application/mozilla-npruntime-scriptable-plugin"];
		if(mimetype) {
			var plugin = mimetype.enabledPlugin;
			if(plugin) {
				//console.log("Plugin had been installed and be enabled.");
				var embed1 = document.getElementById('embed1');
				embed1.CallWinExec("C:\\Program Files\\Internet Explorer\\iexplore.exe", url);
			}
		} else {
			alert("对不起，请安装火狐插件.");
		}
	};
	//zhanghuan
	Utils.showselect = function(config){
		var target,
		    input,
		    X,
		    checkboxP,
		    data;
			target = config.target;
		getData()
		function getData(){
			$.ajax({
				url : urlroot + '/event/getBasePositionList',
				type:'POST',
				contentType : 'application/json; charset=UTF-8',
				dataType : 'JSON',
				success :function(d){
						data = d.returnObject;
						addInput();
						addCheckbox();
						addevent();
				}
			})
		}
		function addInput(){
			input = $('<input type="text" class="search_input" placeholder="默认状态" />');
			X = $('<i class="seach_cancel icon-close-grey icons"></i>')
			target.append(input);
			input.wrap($('<div class="search_input"></div>'));
			input.parent().append(X);
		}
		function addCheckbox(){
			checkboxP = $('<div class="search_checkboxDiv"></div>')
			target.append(checkboxP);
			var $ul = $('<ul>');
			var $all = '<li class="chooseall"><label><input type="checkbox" name="indexall" />全行</label></li>';
			$ul.append($all)
			var $li;
			$.each(data,function(i){
				$li = $('<li>');
				$ul.append($li);
				var html = '<label><input type="checkbox" name="index'+i+'" positionList="'+data[i].basePosCode+'" />'+data[i].shortName+'</label>';
				$li.html(html);
			})
			checkboxP.html($ul);
			checkboxP.find('input[type=checkbox]').checkbox();
			
			checkboxP.mCustomScrollbar({
				  theme:"dark",
				  advanced:{
					  autoScrollOnFocus:false,			//滚动条不自动聚焦
					  updateOnContentResize:true		//自适应内容的大小变化
				  }
		  })
		}
		function addevent(){
			input.unbind('input propertychange').bind("input propertychange",function(){
				var value = $(this).val();
				var d = [];
				$.each(data,function(i){
					var v = data[i].shortName;
						if(v.indexOf(value)>-1){
							checkboxP.find('li').eq(i+1).addClass('machclass');
						}else{
							checkboxP.find('li').eq(i+1).removeClass('machclass');
					}
				})
				checkboxP.find('li').not('.machclass').not(':first').hide();
				checkboxP.find('.machclass').show();
			})
			X.unbind('click').bind('click',function(){
				input.val('');
				checkboxP.find('li').removeClass('machclass');
				checkboxP.find('li').show();
			});
			checkboxP.find('li').eq(0).find('.ui-checkbox-label').bind('click',function(){
				if(!$(this).children('input').is(':checked')){
					checkboxP.find('li').not(':first').find('.ui-checkbox-label i').removeClass('checked');
					checkboxP.find('li').not(':first').find('.ui-checkbox-label input').prop('checked',false);
				}else{
					checkboxP.find('li').not(':first').find('.ui-checkbox-label i').addClass('checked');
					checkboxP.find('li').not(':first').find('.ui-checkbox-label input').prop('checked',true);
				}
			})
		}
		
	};
	Utils.enterFocus = function(){
		var arr = [];
		var index;
		var current,
			nextindex,
			radio;
			length;
		$("body").unbind('keydown.enterfocus').bind('keydown.enterfocus',function(e){
			var el;
			var key = e.keyCode;
			if(key==13){
				current = document.activeElement;
				var form;							// = $(current).closest("form").length==0 ?  $(document.forms) : $(current).closest("form");
				if($(current).closest("form").length==0){
					form = getform();
				}else{
					form = $(current).closest("form");
				}
				arr =  $(form[0].elements);//$(document.forms[0].elements);
				length = arr.length;
				if($(current).is('input[type=text]')){
					index='undefind';
				}
				if(isNaN(index)){
					nextindex = nextElement(current);
				}else{
					nextindex = index;
				}
				index='undefind';
				//	//console.log(nextindex)
				$el = $(arr[nextindex]);
				elementFocus($el,nextindex);
				
			}
		});
		
		function getform(){
			var $form =  $(document.forms);
			var result;
			for(var i=0;i<$form.length;i++){
				var ele = $form[i].elements;
				var re = $(ele).filter(':visible');
				if(re.length>0){
					result = $($form[i]);
					return result;
					break;
				}
			}
			
		}
		
		function elementFocus(el,i){
			var $el = el;
			var el_index = i < length-1 ? i : -1;
			////console.log(el_index+'****'+length)
			if(typeof radio=='object'){
				radio.removeClass('enterfocus-radio');
				radio = '';
			}
			if($el.is("input[type=text]")){
				$el.focus();
			}else if($el.is("input[type=radio]") || $el.is("input[type=checkbox]")){
				$('input').blur();
				$el.next('i').addClass('enterfocus-radio');
				radio = $el.next('i');
				index = el_index+1;
				return;
			}else if($el.is("select")){
					$el.next().focus();
					index = el_index+1;
					return
			}else if(!$el.is(":visible")){
					var t = nextElement($el[0]);
					el = $(arr[t]);
					elementFocus(el,t);
					return;
			}else{
				$('input').blur();
				$el.addClass('enterfocus-radio');
				radio = $el;
				index = el_index+1;
			}
		}
		
		function nextElement(curr){
			var currentEl = curr;
			var temp,
				result=0;
			for(var i=0;i<arr.length;i++){
				var el =arr[i];
				if(el==currentEl){
					temp = i;
					break;
				}
			}
			if(!isNaN(temp)){
				if(temp == arr.length-1){
					result = 0;
				}else{
					result = temp+1
				}
			}else{
				result = 0;
			}
			return result;
		}
		
	};
	Utils.inputCheck = function(){
		
	};
	/*******************
	 * by zhanghuan
	 * 表单重置，参数为外层元素，可以不为form
	 * **********************/
	Utils.formreset = function(form){
		var con = form;
		var select = form.find("select"),
			input,
			textarea,
			radio = form.find("input[type=radio]"),
			checkbox= form.find("input[type=checkbox]");
		if(form.is("form")){
			form[0].reset();
		}else{
			input = form.find("input[type=text]");
			input.each(function(i,v){
				$(this).val($(this).attr("value"));
			})
		}
		select.each(function(i){
			if($(this).parent('.ui-select').length>0){
				var v = $(this).data("value") || ''; 
				$(this).select('option',{value:v});
				$(this).select('refresh');
			}
		})
		radio.each(function(i){
			var img = $(this).next('i.radio');
			if($(this).next('i.radio').length>0){
				if($(this).attr("reset-value")){
					$(this).attr('checked',true);
					$(this).next('i.radio').addClass("checked");
				}else{
					$(this).attr('checked',false);
					$(this).next('i.radio').removeClass("checked");
				}
			}
		})
		checkbox.each(function(i){
			if($(this).next('i.checkbox').length>0){
				if($(this).attr("reset-value")){
					$(this).attr('checked',true);
					$(this).next('i.checkbox').addClass("checked");
				}else{
					$(this).attr('checked',false);
					$(this).next('i.checkbox').removeClass("checked");
				}
			}
		})
	};
	Utils.searchEvent = function(button,form,contain){
		if(arguments.length==2 && arguments[0]=='hide'){
			var hidebutton = arguments[1].length>1 ?arguments[1].eq(1) : arguments[1];
			if(hidebutton.is(':visible')){
				hidebutton.trigger('click');
			}
			return;
		}
		var el = arguments.length >2 ? arguments[2] : arguments[1]; 
		var parent = arguments.length >2 ? arguments[1] : el.closest('.common-header');
		var showBu = arguments[0].eq(0);
		var hideBu = showBu.next("a");
//		var searchBu = showBu.prev("button");
//		searchBu.off('click.searchevent').on('click.searchevent',function(){
//			if(hideBu.is(':visible')){
//				hideBu.trigger('click');
//			}
//		})
		if(!parent.parent().hasClass('searchEvent_wrap')){
			parent.wrap("<div class='searchEvent_wrap' style='overflow:visible'></div>");
			var h = parent.outerHeight();
			parent.parent().height(h);
			parent.height('auto');
		}
		if(el.is(":visible")){
    		hideBu.hide();
			el.slideUp('1000',function(){
    			showBu.show();
			});
			Utils.formreset(el);
		}else{
			showBu.hide();
			el.slideDown('1000',function(){
				hideBu.show();
			});
			
		}
		
	};
	/************************
	 * 参数 （客户号、url 、回调）
	 * 
	 * *******************************/
	Utils.outlink = function(text,url,callback){
		var txt = text || '';
		var _url = url || urlroot + '/finance/out/loadFinQueryPage';
		if(arguments.length==1){
			_url = arguments[0];
			DetectFFPlugin(_url)
			return;
		}
			$.ajax({
				type: 'GET',
				data:{
	        	  	"CustomerID" : txt
		  		},
				url : _url,
				success : function(result) {
					if (result.successed) {
	    				DetectFFPlugin(result.returnObject);
					}
					if(typeof callback == 'function'){
						callback(result)
					}
				}
			});		
		};
	Utils.regularcheck = {
		dotlength:function(value,i,dot){
			if(value){
				var _i = i || 0;
				var _dot = dot || 1;
				var index = value.indexOf(".");
				if(index<0){
					return value.length < i || value.length==i ;
				}else{
					var inter = value.substring(0,index);
					var dotvalue = value.substring(index+1,value.length);
					if(inter.length > _i || dotvalue.length >_dot){
						return false;
					}else{
						return true;
					}
				}
			}
		}	
	};
	Utils.CashFormat = {
		/**
		 * 转换为中文金额表示
		 *
		 * @param cash {String}
		 *            要转换的金额字符串
		 * @return {String} 转换后的金额字符串
		 */
		toChineseCash : function(cash) {
			var noCommaCash = this.removeComma(cash);
			if (!this.isFloat(noCommaCash)){
				var myValCash = this.convertIntegerToChineseCash(noCommaCash)+'整';
				myValCash.substring(0,1) == '拾' && (myValCash = '壹' + myValCash);
				return myValCash.replace(/零拾/g,'零壹拾');
			}
			var dotIndex = noCommaCash.indexOf('.');
			var integerCash = noCommaCash.substring(0, dotIndex);
			var decimalCash = noCommaCash.substring(dotIndex + 1);
			var myValCash = this.convertIntegerToChineseCash(integerCash) + this.convertDecimalToChineseCash(decimalCash);
			myValCash.substring(0,1) == '拾' && (myValCash = '壹' + myValCash);
			return myValCash.replace(/零拾/g,'零壹拾');
		},
		/**
		 * 为金额添加,分割符
		 *
		 * @param {String}
		 *            要转换的金额字符串
		 * @return {String} 转换后的金额字符串
		 */
		toCashWithComma : function(cash) {
			if (!this.isFloat(cash))
				return this.addComma(cash);

			var dotIndex = cash.indexOf('.');
			var integerCash = cash.substring(0, dotIndex);
			var decimalCash = cash.substring(dotIndex);

			return this.addComma(integerCash) + decimalCash;
		},
		inputCash:function(tar){
			var cash;
			if(tar&&typeof tar=='object'){
				tar.bind('blur',function(){
					cash = Utils.CashFormat.removeComma($(this).val());
					if(!isNaN(cash)){
						var m = Utils.CashFormat.toCashWithComma(cash);
						$(this).val(m);
					}
				});
				tar.bind('focus',function(){
					cash = Utils.CashFormat.removeComma($(this).val());
					if(!isNaN(cash)){
						$(this).val(cash);
					}
				});
			}
		},
		/**
		 * 为金额添加,分割符
		 *
		 * @param {String}
		 *            要转换的金额字符串
		 * @return {String} 转换后的金额字符串
		 * @modify for toCashWithComma
		 */
		toCashWithCommaForNew : function(cash) {
			var retvalue = "";
			var flag = "";
			if (!isFloat(cash) && cash.length > 0) {
				cash = cash.substring(1, cash.length);
				flag = "-";
			}
			if (!isFloat(cash))
				retvalue = this.addComma(cash);
			var dotIndex = cash.indexOf('.');
			var integerCash = cash.substring(0, dotIndex);
			var decimalCash = cash.substring(dotIndex);

			retvalue = this.addComma(integerCash) + decimalCash;

			return flag + retvalue;
		},
		/**
		 * 为金额移除,分割符
		 *
		 * @param {String}
		 *            要转换的金额字符串
		 * @return {String} 转换后的金额字符串
		 */
		removeComma : function(cash) {
			return cash.replace(/\,/g, '');
		},

		/**
		 * 将小数点前的数字转换为中文货币表示
		 *
		 * @param {String}
		 *            要转换的金额
		 * @return {String} 转换后的金额
		 */
		convertIntegerToChineseCash : function(cash) {
			if (cash == "0")
				return "零元";
			var S = ""; // 返回值
			var p = 0; // 字符位置指针
			var m = cash.length % 4; // 取模
			var Units = ['','万','亿','万亿'];
			var Nums = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
			var Digits = ['','拾','佰','仟'];

			// 四位一组得到组数
			var k = (m > 0 ? Math.floor(cash.length / 4) + 1 : Math.floor(cash.length / 4));
			// 外层循环在所有组中循环
			// 从左到右 高位到低位 四位一组 逐组处理
			// 每组最后加上一个单位: "[万亿]","[亿]","[万]"
			for ( var i = k; i > 0; i--) {
				var L = 4;
				if (i == k && m != 0) {
					L = m;
				}
				// 得到一组四位数 最高位组有可能不足四位
				var s = cash.substring(p, p + L);
				var l = s.length;

				// 内层循环在该组中的每一位数上循环 从左到右 高位到低位
				for ( var j = 0; j < l; j++) {
					var n = parseInt(s.substring(j, j + 1));
					if (n == 0) {
						if ((j < l - 1) && (parseInt(s.substring(j + 1, j + 1 + 1)) > 0) // 后一位(右低)
								&& S.substring(S.length - 1, S.length) != Nums[n]) {
							S += Nums[n];
						}
					} else {
						// 处理 1013 一千零"十三", 1113 一千一百"一十三"
						if (!(n == 1 && (S.substring(S.length - 1, S.length) == Nums[0] | S.length == 0) && j == l - 2)) {
							S += Nums[n];
						}
						S += Digits[l - j - 1];
					}
				}
				p += L;
				// 每组最后加上一个单位: [万],[亿] 等
				if (i < k)// 不是最高位的一组
				{
					if (parseInt(s) != 0) {
						// 如果所有 4 位不全是 0 则加上单位 [万],[亿] 等
						S += Units[i - 1];
					}
				} else {
					// 处理最高位的一组,最后必须加上单位
					S += Units[i - 1];
				}
			}
			// alert(S);
			return S + "元";
		},

		/**
		 * 将小数点后的数字转换为中文货币表示
		 *
		 * @param {String}
		 *            要转换的金额
		 * @return {String} 转换后的金额
		 */
		convertDecimalToChineseCash : function(cash) {
			var returnCash = "";
			var Nums = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
			if (cash == "0"||cash == "00")
				returnCash = "整";
			else {
				for ( var i = 0; i < cash.length; i++) {
					if (i >= 2)
						break;
					var intValue = parseInt(cash.charAt(i));

					switch (i) {
					case 0:
						if (intValue != 0){
							returnCash += Nums[intValue] + "角";
						}else{
							returnCash += Nums[intValue]
						}
							
						break;
					case 1:
						if (intValue != 0)
						returnCash += Nums[intValue] + "分";
						break;
					default:
						break;
					}
				}
			}
			return returnCash;
		},
		/**
		 * 判断是否为浮点数
		 *
		 * @param {String}
		 *            要判断的的值
		 */
		isFloat : function(val) {
			return val.indexOf('.') >= 0;
		},
		/**
		 * 为数字添加逗号分隔符
		 *
		 * @param {String}
		 *            要添加逗号分隔符的值
		 */
		addComma : function(str) {
			var hasMinus = false;
			if(str.indexOf('-') != -1){
				str = str.replace(/[-]/g, '');
				hasMinus = true;
			}
			if (str.length > 3) {
				var mod = str.length % 3;
				var output = (mod > 0 ? (str.substring(0, mod)) : '');
				for (i = 0; i < Math.floor(str.length / 3); i++) {
					if ((mod == 0) && (i == 0))
						output += str.substring(mod + 3 * i, mod + 3 * i + 3);
					else
						output += ',' + str.substring(mod + 3 * i, mod + 3 * i + 3);
				}
				if(hasMinus == true){
					return ('-' + output);
				}else{
					return (output);
				}
			} else{
				if(hasMinus == true){
					return ('-' + str);
				}else{
					return str;
				}
			}
				
		},
		/**
		 * 阿拉伯数字转换为普通中文汉字形式
		 * @param {String}
		 *             要转换的阿拉伯数字字符串
		 * @return {String}
		 *             返回转换后的中文字符串
		 */
		numToChinese : function(str){
			var minusFlag = false;
			//判断是否为负数
			if(str.indexOf('-') != '-1'){
				var str = str.replace(/[-]/g,'');
				var minusFlag = true;
			}
			//判断是否为浮点数
			if(this.isFloat(str)){
				//是浮点数执行
				var returnNum = this.numToChineseFloat(str);
			}else{
				//非浮点数执行
				var returnNum = this.numToChineseNor(str);
			}
			if(minusFlag){
				return '负' + returnNum;
			}else{
				return returnNum;
			}
		},
		/**
		 * 浮点数转中文汉字
		 * @param {String}
		 *            要转换的浮点数
		 * @return {String}
		 *            返回的中文汉字
		 */
		numToChineseFloat : function(str){
			var numPointBefore = str.split('.')[0];
			var numPointAfter = str.split('.')[1];
			var newNumChange = this.numToChineseNor(numPointBefore) + '点' + this.numToChinesePoint(numPointAfter);
			return newNumChange;
		},
		/**
		 * 非浮点数转中文汉字
		 * @param {String}
		 *            要转换的一般数字
		 * @return {String}
		 *            返回的中文汉字
		 */
		numToChineseNor : function(str){
			var Nums = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖','拾','佰','仟','万','亿','万亿'];
			var NumC = ['零','一','二','三','四','五','六','七','八','九','十','百','千','万','亿','万亿'];
			var norNumBig = this.convertIntegerToChineseCash(str);
			var newStr = '';
			for(var i = 0;i < norNumBig.length; i++){
				var strObj = norNumBig.substring(i,i+1);
				var strIndex = $.inArray(strObj,Nums);
				if(strIndex == -1){
					continue;
				}
				//strIndex == -1 && continue;
				newStr+=NumC[strIndex];
			}
			return newStr;
		},
		/**
		 * 小数点后面的转中文
		 * @param {String}
		 *            要转换的一般数字
		 * @return {String}
		 *            返回的中文汉字
		 */
		numToChinesePoint : function(str){
			var Nums = ['0','1','2','3','4','5','6','7','8','9'];
			var NumC = ['零','一','二','三','四','五','六','七','八','九'];
			var norNumBig = str;
			var newStr = '';
			for(var i = 0;i < norNumBig.length; i++){
				var strObj = norNumBig.substring(i,i+1);
				var strIndex = $.inArray(strObj,Nums);
				if(strIndex == -1){
					continue;
				}
				//strIndex == -1 && continue;
				newStr+=NumC[strIndex];
			}
			return newStr;
		}
	};
	/**
	 * textarea输入域控制字数，并试试提示可输入字数
	 * @param controlEl{String/jQuery}
	 *            要控制的元素名称，遵循jQuery选择器使用方式
	 * @param surplusEl{String/jQuery}
	 * 			  剩余字数显示的区域，遵循jQuery选择器使用方式
	 * @author guowenfeng
	 */
	Utils.textControl = function(controlEl,surplusEl){
		//获取控制的表单元素
		var $controlEl = $(controlEl);
		//获取要显示
		var $surplusEl = $(surplusEl);
		//获取最大值
		var textNum = $controlEl.attr('maxlength');
		//获取剩余数
		var textSurNum = textNum - $controlEl.val().length;
		//设置显示剩余数
		$surplusEl.text(textSurNum);
	};
	Utils.Rules = {
		//只支持数字输入四位一个空格
		cardNum : function(val){
			var cardVal = val;
			return cardVal.replace(/[^a-zA-Z0-9]/g, '').replace(/(\w{4})(?=\w)/g,"$1 ");
		},
		//移除空格
		removeSpace : function(val){
			var cardVal = val;
			return cardVal.replace(/\s/g,'');
		},
		ORG_CODE : {
			rule : function validate(code) {
				code += '';
				if (/^[0-9A-Z]{2}[0-9]{6}-[0-9A-Z]$/.test(code) && code.length === 10) {
					code = code.substring(0, 16);
					var wv = 0;
					wv += code.charCodeAt(0) + (/[A-Z]/.test(code[0]) ? (32 - 87) : -48);
					wv += code.charCodeAt(1) + (/[A-Z]/.test(code[1]) ? (-65 + 10) : -48);
					for ( var i = 2; i < 8; i++) {
						wv += code.charCodeAt(i) - 48;
					}
					wv = 11 - (wv % 11);
					return (10 === wv && 'X' === code[9]) || (11 === wv && '0' === code[9]) || (code.charCodeAt(9) - 48 === wv);
				}
				return false;
			},
			fail : '组织机构代码输入错误'
		},
		MAIL : {
			rule : function validate(mail) {
				return /^[0-9A-Za-z-_.]*@[0-9A-Za-z-_.]*\.(com|net|cn|edu|org)$/.test(mail);
			},
			fail : '邮箱格式错误'
		},
		LOAN_CARD : {
			rule : function validate(card) {
				var WEIGHT = [ 1, 3, 5, 7, 11, 2, 13, 1, 1, 17, 19, 97, 23, 29 ];
				card += '';
				if (/^[0-9A-Z]*$/.test(card) && card.length >= 16) {
					card = card.substring(0, 16);
					var wv = 0;
					for ( var i = 0; i < 14; i++) {
						wv += (card.charCodeAt(i) - (/[A-Z]/.test(card[i]) ? 55 : 48)) * WEIGHT[i];
					}
					return (wv % 97 + 1) === ((card.charCodeAt(14) - 48) * 10 + (card.charCodeAt(15) - 48));
				}
				return false;
			},
			fail : '贷款证编号错误'
		},
		ID:{
			rule:function(id){
				return /^\d{15}|(\d{17})(\d|X|x)$/.test(id);
			},
			fail:'身份证错误'
		},
		POST_CODE:{
			rule:function(pc){
				return /^[1-9][0-9]{5}$/.test(pc);
			},
			fail:'邮编格式错误'
		}
		
	};
	this.HZBank = HZBank;
})(this);
